<?php

namespace Orders\Entity;

class PushOrderHeaderEntity
{
	private string $appType			=	'1';		//	报送类型: 1-新增 2-变更 3-删除。默认为1。
	private string $orderType		=	'I';	//	电子订单类型：I进口
	private string $appStatus		=	'2';		//	业务状态:1-暂存,2-申报,默认为2
	private string $currencyCus		=	'142';	//	币制（关） 限定为人民币，填写“142”
	private string $currencyCiq		=	'156';	//	限定为人民币，填写“156”
	private string $buyerIdType		=	'1';	//	订购人证件类型 1-身份证,2-其它。限定为身份证，填写“1”
	private string $consigneeIdType	=	'1';	//	1-身份证,2-其它。限定为身份证，填写“1”
	private string $tradeMode		=	'1210';	//	保税进口填写“1210”
	private string $headField1		=	'';		//	9610模式填写‘口岸海关代码’，必填。
	private string $packNo			=	'1';		//	件数为包裹数量，限定为“1”。
	private string $country			=	'142';	//	 保税进口填写代码“142”。
	private string $freight			=	'0.00';		//	不包含在商品价格中的运杂费，无则填写"0"
	private string $discount		=	'0.00';		//	使用积分、虚拟货币、代金券等非现金支付金额
	private string $taxTotal		=	'0.00';		//	企业预先代扣的税款金额，无则填写“0”
	private string $headField2		=	'';	//	电商平台代码
	private string $headField4		=	'0.00';	//	表头预留字段，以便后期扩展
	private string $headField5		=	'0.00';	  //	表头预留字段，以便后期扩展
	private string $headField6		=	'0.00';	//	否	表头预留字段，以便后期扩展
	private string $trafNo 			=	'1';				//	运输工具编号
	private string $consigneeCountry=	'142';	//	收货人所在国国别代码，参考保税提供的数据字典
	private string $payCode			=	'312226T001';			//	支付企业代码
	private string $voyageNo		=	'';			//	航班航次号 保税进口免填。
	private string $logisticsCode	=	'4101985185';	//	物流企业的河南保税注册登记编号。
	private string $assureCode		=	'650168000V';			//	担保扣税的企业海关注册登记编号
	private string $emsNo 			=	'S4611I000308N';				//	保税模式必填。
	private string $batchNumbers	=	'S4611I000308N';		//	商品批次号
	private string $agentCodeCus	=	'4101983436';		//	申报企业代码（关）申报企业在海关的备案代码
	private string $agentCodeCiq	=	'4101983436';		//	申报企业在国检的备案代码
	private string $areaCode		=	'4101W68006';			//	保税模式必填，区内仓储企业的河南保税注册登记编号。直购进口为空
	private string $ieDate			=	'';				//	进口日期 运载所申报商品的运输工具申报进境的日期，进口申报时无法确知相应的运输工具的实际进境日期时，免填。格式:YYYYMMDD
	
	private string $billNo			=	'';				//	提运单号 直购进口必填。货物提单或运单的编号，保税进口免填。

	private string $consigneeDistrict = '';
	private string $loctNo 			  = '';				//	监管场所代码 针对同一申报地海关下有多个跨境电子商务的监管场所,需要填写区分
	private string $licenseNo 		  = '';			//	商务主管部门及其授权发证机关签发的进出口货物许可证件的编号
	private string $note 			  =	'';				//	备注
	private string $headField3 		  = '';			//	表头预留字段，以便后期扩展

	private string $orderNo;			//	交易平台的订单编号
	
	private string $shipper;			//	发货人名称
	private string $shipperAddress;		//	发货人地址
	private string $shipperTelephone;	//	发货人电话
	private string $shipperCountry;		//	发货人所在国国别代码，参考保税提供的数据字典
	
	private string $buyerRegNo;			//	订购人的交易平台注册号
	private string $buyerName;			//	订购人的真实姓名。
	private string $buyerIdNumber;		//	订购人的身份证件号码
	private string $buyerTelephone;		//	订购人电话。
	
	private string $consignee;			//	收货人姓名，必须与电子运单的收货人姓名一致
	private string $eProvince;			//	收货人省份
	private string $consigneeCity;		//	收货人市
	private string $consigneeZone;		//	收货人区县
	private string $consigneeAddress;	//	收货地址
	
	private string $consigneeTelephone;	//	收货人联系电话，必须与电子运单的收货人电话一致
	private string $consigneeIdNumber;	//	收货人身份证件号码
	
	
	
	private string $logisticsNo;		//	物流企业的运单包裹面单号
	
	
	private string $payTransactionId;	//	支付流水号
	
	

	
	
	private string $declTime;			//	申报日期
	
	
	private string $trafMode;			//	是	填写海关标准的参数代码，参照《JGS-20 海关业务代码集》- 运输方式代码。直购进口指跨境段物流运输方式，保税进口指二线出区物流运输方式。
	
	
	
	
	private string $packageTypeCus;		//	海关对进出口货物实际采用的外部包装方式的标识代码，采用1 位数字表示，如：木箱、纸箱、桶装、散装、托盘、包、油罐车等
	private string $packageTypeCiq;		//	国检对进出口货物实际采用的外部包装方式的标识代码
	
	
	
	
	private string  $insuredFee;			//	物流企业实际收取的商品保价费用。
	private string  $grossWeight;		//	毛重（公斤）
	private string  $netWeight;			//	净重（公斤）
	private string  $acturalPaid;		//	总费用
	private string  $goodsValue;			//	商品实际成交价，含非现金抵扣金额。
	
	

    public function __construct(array $param)
    {
        $this->orderNo  =   $param['orderNo'] ?? '';
        $this->shipper  =   $param['shipper'] ?? '';			//	发货人名称
        $this->shipperAddress  =   $param['shipperAddress'] ?? '';		//	发货人地址
        $this->shipperTelephone  =   $param['shipperTelephone'] ?? '';	//	发货人电话
        $this->shipperCountry  =   $param['shipperCountry'] ?? '142';		//	发货人所在国国别代码，参考保税提供的数据字典
        $this->buyerRegNo  =   $param['buyerRegNo'] ?? '';			//	订购人的交易平台注册号
        $this->buyerName  =   $param['buyerName'] ?? '';			//	订购人的真实姓名。
        $this->buyerIdNumber  =   $param['buyerIdNumber'] ?? '';		//	订购人的身份证件号码
        $this->buyerTelephone  =   $param['buyerTelephone'] ?? '';		//	订购人电话。
        $this->consignee  =   $param['consignee'] ?? '';			//	收货人姓名，必须与电子运单的收货人姓名一致
        $this->eProvince  =   $param['eProvince'] ?? '';			//	收货人省份
        $this->consigneeCity  =   $param['consigneeCity'] ?? '';		//	收货人市
        $this->consigneeZone  =   $param['consigneeZone'] ?? '';		//	收货人区县
        $this->consigneeAddress  =   $param['consigneeAddress'] ?? '';	//	收货地址
        $this->consigneeTelephone  =   $param['consigneeTelephone'] ?? '';	//	收货人联系电话，必须与电子运单的收货人电话一致
        $this->consigneeIdNumber  =   $param['consigneeIdNumber'] ?? '';	//	收货人身份证件号码
   
        $this->logisticsNo = $param['logisticsNo'];	//	物流单号
        $this->payTransactionId = $param['payTransactionId']; // 支付流水号
        $this->declTime = date('Ymd');	//	申报日期
        $this->trafMode = $param['trafMode'];
        $this->packageTypeCus =  $param['packageTypeCus'] ?? '1';
        $this->packageTypeCiq = $param['packageTypeCiq'] ?? '1';
        $this->insuredFee = $param['insuredFee'] ?? '0.00';
        $this->grossWeight = $param['grossWeight'];
        $this->netWeight = $param['netWeight'];
        $this->acturalPaid = $param['acturalPaid'];
        $this->goodsValue = $param['goodsValue'];
    }

    public function getAllAttributes(): array
    {
        $attributes = [];
        $reflectionClass = new \ReflectionClass($this);
        $properties = $reflectionClass->getProperties(\ReflectionProperty::IS_PRIVATE);

        foreach ($properties as $property) {
            $propertyName = $property->getName();
            if(is_null($this->$propertyName)){
                throw new \Exception("方法 $propertyName 不能为空");
            }
            $attributes[$propertyName] = $this->$propertyName;
        }

        return $attributes;
    }
    // Setter方法
    public function __set($name, $value) {
        if (property_exists($this, $name)) {
            $this->$name = $value;
        } else {
            throw new \Exception("Property $name does not exist");
        }
    }

    // Getter方法
    public function __get($name) {
        if (property_exists($this, $name)) {
            return $this->$name;
        } else {
            throw new \Exception("Property $name does not exist");
        }
    }
	

}